home *** CD-ROM | disk | FTP | other *** search
/ Total Web Page (Professional Suite) / Total Web Page 99.iso / CGI / DOWNLOAD.CGI-S=CCVER&C=TXT&F=CC_VER.PL < prev    next >
Perl Script  |  1996-06-03  |  13KB  |  397 lines

  1. #!/usr/local/bin/perl
  2. #
  3. # CC-Verify script for Visa, MasterCard, Amex and Novus Cards
  4. # Written 29 June 1996 by Spider (spider@servtech.com)
  5. # http://w3works.com
  6. # http://www.servtech.com/public/spider
  7. #
  8. # Loosely based on a re-post of original by Melvyn Myers 
  9. # (initial author unknown) but this revision covers all 13, 
  10. # 15 and 16 digit cards using the Mod 10 algorithm.
  11.  
  12. ##############################################################################
  13. # COPYRIGHT NOTICE                                                           #
  14. # Copyright 1996 Dave Paris (aka Spider)  All Rights Reserved.               #
  15. #                                                                            #
  16. # The Validator may be used and modified free of charge by anyone so long as #
  17. # this copyright notice and the comments above remain intact.  By using this #
  18. # code you agree to indemnify Dave Paris from any liability that might       #  
  19. # arise from it's use.                                                       #  
  20. #                                                                            #
  21. # Selling the code for this program without prior written consent is         #
  22. # expressly forbidden.  In other words, please ask first before you try and  #
  23. # make money off of my program.                                              #
  24. #                                                                            #
  25. # Obtain permission before redistributing this software over the Internet or #
  26. # in any other medium.  In all cases copyright and header must remain intact.#
  27. # This Copyright is in full effect in any country that has International     #
  28. # Trade Agreements with the United States of America.                        #
  29. ##############################################################################
  30.  
  31. # Get the input
  32. read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  33.  
  34. # Split the name-value pairs
  35. @pairs = split(/&/, $buffer);
  36.  
  37. foreach $pair (@pairs)
  38. {
  39.     ($name, $value) = split(/=/, $pair);
  40.  
  41.     # Un-Webify plus signs and %-encoding
  42.     $value =~ tr/+/ /;
  43.     $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  44.  
  45.     # Stop people from using subshells to execute commands
  46.     # Not a big deal when using sendmail, but very important
  47.     # when using UCB mail (aka mailx).
  48.       $value =~ s/~!/ ~!/g;
  49.  
  50.     # Uncomment for debugging purposes
  51.     # print "Setting $name to $value<P>";
  52.  
  53.     $FORM{$name} = $value;
  54.     if ($value =~ /\<\!--\#(.*)\s+(.*)\s?=\s?(.*)--\>/) { &kill_input; }
  55.     if ($value =~ /[;><\*`\|]/) { &kill_input; }    
  56. }
  57.  
  58. print "Content-type: text/html\n\n";
  59.  
  60. if ($FORM{'payby'} eq "yes") {
  61.     &no_data unless $FORM{'cardholder'};
  62.     &no_data unless $FORM{'cardnumber'};
  63.     &no_data unless $FORM{'cardexp'};
  64.     &CC_Verify;
  65. } else {
  66.     print "Thanks\n";
  67. # You may choose to place something else here, like calling a printable form subroutine
  68.     exit;
  69. }
  70.  
  71.     
  72. sub CC_Verify {
  73.  
  74. $cardnumber = $FORM{'cardnumber'}; 
  75.  
  76. # Remove any spaces or dashes in card number
  77. $cardnumber =~ s/ //g;
  78. $cardnumber =~ s/-//g;
  79. $length = length($cardnumber);
  80.  
  81. # Make sure that only numbers exist
  82. if (!($cardnumber =~ /^[0-9]*$/)) {
  83.  &invalid_cc;
  84.  }
  85.  
  86. # Verify correct length for each card type
  87. if ($FORM{'cardtype'} eq "visa") { &vlen; }
  88. if ($FORM{'cardtype'} eq "mastercard") { &mclen; }
  89. if ($FORM{'cardtype'} eq "amex") { &alen; }
  90. if ($FORM{'cardtype'} eq "novus") { &nlen; }
  91.  
  92. sub vlen {
  93.     &invalid_cc unless (($length ==13) || ($length == 16));
  94. }
  95. sub mclen {
  96.     &invalid_cc unless ($length == 16);    
  97. }
  98. sub alen {
  99.     &invalid_cc unless ($length == 15);    
  100. }
  101. sub nlen {
  102.     &invalid_cc unless ($length == 16);    
  103. }
  104.  
  105. # Now Verify via Mod 10 for each one
  106. if ($FORM{'cardtype'} eq "visa") { &vver; }
  107. if ($FORM{'cardtype'} eq "mastercard") { &ver16; }
  108. if ($FORM{'cardtype'} eq "amex") { &ver15; }
  109. if ($FORM{'cardtype'} eq "novus") { &ver16; }
  110.  
  111. # pick one for Visa
  112. sub vver {
  113.     if ($length == 13) { &ver13; }
  114.     if ($length == 16) { &ver16; }
  115. }
  116.  
  117. # For 13 digit cards
  118. sub ver13 {
  119.         $cc0 = substr($cardnumber,0,1);
  120.         $cc1 = substr($cardnumber,1,1);
  121.         $cc2 = substr($cardnumber,2,1);
  122.         $cc3 = substr($cardnumber,3,1);
  123.         $cc4 = substr($cardnumber,4,1);
  124.         $cc5 = substr($cardnumber,5,1);
  125.         $cc6 = substr($cardnumber,6,1);
  126.         $cc7 = substr($cardnumber,7,1);
  127.         $cc8 = substr($cardnumber,8,1);
  128.         $cc9 = substr($cardnumber,9,1);
  129.         $cc10 = substr($cardnumber,10,1);
  130.         $cc11 = substr($cardnumber,11,1);
  131.         $cc12 = substr($cardnumber,12,1);
  132.  
  133.         $cc1a = $cc1 * 2;
  134.         $cc3a = $cc3 * 2;
  135.         $cc5a = $cc5 * 2;
  136.         $cc7a = $cc7 * 2;
  137.         $cc9a = $cc9 * 2;
  138.         $cc11a = $cc11 * 2;
  139.  
  140.         if ($cc1a >= 10) {
  141.             $cc1b = substr($cc1a,0,1);
  142.             $cc1c = substr($cc1a,1,1);
  143.             $cc1 = $cc1b+$cc1c;
  144.         } else {
  145.             $cc1 = $cc1a;
  146.         }
  147.         if ($cc3a >= 10) {
  148.             $cc3b = substr($cc3a,0,1);
  149.             $cc3c = substr($cc3a,1,1);
  150.             $cc3 = $cc3b+$cc3c;
  151.         } else {
  152.             $cc3 = $cc3a;
  153.         }
  154.         if ($cc5a >= 10) {
  155.             $cc5b = substr($cc5a,0,1);
  156.             $cc5c = substr($cc5a,1,1);
  157.             $cc5 = $cc5b+$cc5c;
  158.         } else {
  159.             $cc5 = $cc5a;
  160.         }
  161.         if ($cc7a >= 10) {
  162.             $cc7b = substr($cc7a,0,1);
  163.             $cc7c = substr($cc7a,1,1);
  164.             $cc7 = $cc7b+$cc7c;
  165.         } else {
  166.             $cc7 = $cc7a;
  167.         }
  168.         if ($cc9a >= 10) {
  169.             $cc9b = substr($cc9a,0,1);
  170.             $cc9c = substr($cc9a,1,1);
  171.             $cc9 = $cc9b+$cc9c;
  172.         } else {
  173.             $cc9 = $cc9a;
  174.         }
  175.         if ($cc11a >= 10) {
  176.             $cc11b = substr($cc11a,0,1);
  177.             $cc11c = substr($cc11a,1,1);
  178.             $cc11 = $cc11b+$cc11c;
  179.         } else {
  180.             $cc11 = $cc11a;
  181.         }
  182.  
  183.         $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12;
  184.         if (substr($val,1,1) !=0 ) {
  185.             &invalid_cc;
  186.         }
  187.     }
  188.  
  189. # For 16 digit cards
  190. sub ver16 {
  191.         $cc0 = substr($cardnumber,0,1);
  192.         $cc1 = substr($cardnumber,1,1);
  193.         $cc2 = substr($cardnumber,2,1);
  194.         $cc3 = substr($cardnumber,3,1);
  195.         $cc4 = substr($cardnumber,4,1);
  196.         $cc5 = substr($cardnumber,5,1);
  197.         $cc6 = substr($cardnumber,6,1);
  198.         $cc7 = substr($cardnumber,7,1);
  199.         $cc8 = substr($cardnumber,8,1);
  200.         $cc9 = substr($cardnumber,9,1);
  201.         $cc10 = substr($cardnumber,10,1);
  202.         $cc11 = substr($cardnumber,11,1);
  203.         $cc12 = substr($cardnumber,12,1);
  204.         $cc13 = substr($cardnumber,13,1);
  205.         $cc14 = substr($cardnumber,14,1);
  206.         $cc15 = substr($cardnumber,15,1);
  207.  
  208.         $cc0a = $cc0 * 2;
  209.         $cc2a = $cc2 * 2;
  210.         $cc4a = $cc4 * 2;
  211.         $cc6a = $cc6 * 2;
  212.         $cc8a = $cc8 * 2;
  213.         $cc10a = $cc10 * 2;
  214.         $cc12a = $cc12 * 2;
  215.         $cc14a = $cc14 * 2;
  216.  
  217.         if ($cc0a >= 10) {
  218.             $cc0b = substr($cc0a,0,1);
  219.             $cc0c = substr($cc0a,1,1);
  220.             $cc0 = $cc0b+$cc0c;
  221.         } else {
  222.             $cc0 = $cc0a;
  223.         }
  224.         if ($cc2a >= 10) {
  225.             $cc2b = substr($cc2a,0,1);
  226.             $cc2c = substr($cc2a,1,1);
  227.             $cc2 = $cc2b+$cc2c;
  228.         } else {
  229.             $cc2 = $cc2a;
  230.         }
  231.         if ($cc4a >= 10) {
  232.             $cc4b = substr($cc4a,0,1);
  233.             $cc4c = substr($cc4a,1,1);
  234.             $cc4 = $cc4b+$cc4c;
  235.         } else {
  236.             $cc4 = $cc4a;
  237.         }
  238.         if ($cc6a >= 10) {
  239.             $cc6b = substr($cc6a,0,1);
  240.             $cc6c = substr($cc6a,1,1);
  241.             $cc6 = $cc6b+$cc6c;
  242.         } else {
  243.             $cc6 = $cc6a;
  244.         }
  245.         if ($cc8a >= 10) {
  246.             $cc8b = substr($cc8a,0,1);
  247.             $cc8c = substr($cc8a,1,1);
  248.             $cc8 = $cc8b+$cc8c;
  249.         } else {
  250.             $cc8 = $cc8a;
  251.         }
  252.         if ($cc10a >= 10) {
  253.             $cc10b = substr($cc10a,0,1);
  254.             $cc10c = substr($cc10a,1,1);
  255.             $cc10 = $cc10b+$cc10c;
  256.         } else {
  257.             $cc10 = $cc10a;
  258.         }
  259.         if ($cc12a >= 10) {
  260.             $cc12b = substr($cc12a,0,1);
  261.             $cc12c = substr($cc12a,1,1);
  262.             $cc12 = $cc12b+$cc12c;
  263.         } else {
  264.             $cc12 = $cc12a;
  265.         }
  266.         if ($cc14a >= 10) {
  267.             $cc14b = substr($cc14a,0,1);
  268.             $cc14c = substr($cc14a,1,1);
  269.             $cc14 = $cc14b+$cc14c;
  270.         } else {
  271.             $cc14 = $cc14a;
  272.         }
  273.  
  274.         $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14+$cc15;
  275.         if (substr($val,1,1) !=0 ) {
  276.             &invalid_cc;
  277.         }
  278.     }
  279.  
  280.  
  281. # For 15 digit (Amex) cards
  282. sub ver15 {
  283.         $cc0 = substr($cardnumber,0,1);
  284.         $cc1 = substr($cardnumber,1,1);
  285.         $cc2 = substr($cardnumber,2,1);
  286.         $cc3 = substr($cardnumber,3,1);
  287.         $cc4 = substr($cardnumber,4,1);
  288.         $cc5 = substr($cardnumber,5,1);
  289.         $cc6 = substr($cardnumber,6,1);
  290.         $cc7 = substr($cardnumber,7,1);
  291.         $cc8 = substr($cardnumber,8,1);
  292.         $cc9 = substr($cardnumber,9,1);
  293.         $cc10 = substr($cardnumber,10,1);
  294.         $cc11 = substr($cardnumber,11,1);
  295.         $cc12 = substr($cardnumber,12,1);
  296.         $cc13 = substr($cardnumber,13,1);
  297.         $cc14 = substr($cardnumber,14,1);
  298.  
  299.         $cc1a = $cc1 * 2;
  300.         $cc3a = $cc3 * 2;
  301.         $cc5a = $cc5 * 2;
  302.         $cc7a = $cc7 * 2;
  303.         $cc9a = $cc9 * 2;
  304.         $cc11a = $cc11 * 2;
  305.         $cc13a = $cc13 * 2;
  306.  
  307.         if ($cc1a >= 10) {
  308.             $cc1b = substr($cc1a,0,1);
  309.             $cc1c = substr($cc1a,1,1);
  310.             $cc1 = $cc1b+$cc1c;
  311.         } else {
  312.             $cc1 = $cc1a;
  313.         }
  314.         if ($cc3a >= 10) {
  315.             $cc3b = substr($cc3a,0,1);
  316.             $cc3c = substr($cc3a,1,1);
  317.             $cc3 = $cc3b+$cc3c;
  318.         } else {
  319.             $cc3 = $cc3a;
  320.         }
  321.         if ($cc5a >= 10) {
  322.             $cc5b = substr($cc5a,0,1);
  323.             $cc5c = substr($cc5a,1,1);
  324.             $cc5 = $cc5b+$cc5c;
  325.         } else {
  326.             $cc5 = $cc5a;
  327.         }
  328.         if ($cc7a >= 10) {
  329.             $cc7b = substr($cc7a,0,1);
  330.             $cc7c = substr($cc7a,1,1);
  331.             $cc7 = $cc7b+$cc7c;
  332.         } else {
  333.             $cc7 = $cc7a;
  334.         }
  335.         if ($cc9a >= 10) {
  336.             $cc9b = substr($cc9a,0,1);
  337.             $cc9c = substr($cc9a,1,1);
  338.             $cc9 = $cc9b+$cc9c;
  339.         } else {
  340.             $cc9 = $cc9a;
  341.         }
  342.         if ($cc11a >= 10) {
  343.             $cc11b = substr($cc11a,0,1);
  344.             $cc11c = substr($cc11a,1,1);
  345.             $cc11 = $cc11b+$cc11c;
  346.         } else {
  347.             $cc11 = $cc11a;
  348.         }
  349.         if ($cc13a >= 10) {
  350.             $cc13b = substr($cc13a,0,1);
  351.             $cc13c = substr($cc13a,1,1);
  352.             $cc13 = $cc13b+$cc13c;
  353.         } else {
  354.             $cc13 = $cc13a;
  355.         }
  356.  
  357.         $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14;
  358.         if (substr($val,1,1) !=0 ) {
  359.             &invalid_cc;
  360.         }
  361.     }
  362.  
  363.  
  364. }
  365.  
  366. #####
  367. #
  368. # This Section For Anything Past CC Validation
  369. #
  370. #####
  371. print "Thank You\!  Your Card Has Passed Validation.  It will now be submitted for Charge Authorization.\n";
  372. exit;
  373.  
  374. sub invalid_cc {
  375.     print "The Credit Card number you've supplied does not pass verification.  Please \n";
  376.     print "use your <B>Back</B> button and verify that the number you've entered is correct \n";
  377.     print "and contains no additional characters other than spaces or hyphens.\n";
  378.     exit;
  379. }
  380.  
  381. sub kill_input {
  382.     print "Content-type: text/html\n\n";
  383.     $value = "";
  384.     print "<CENTER><H1><FONT COLOR=\"\#FF0000\">CGI Alert</FONT></H1></CENTER>\n";
  385.     print "<CENTER><H3>It appears as though you've tried to \n";
  386.     print "execute a system command via a SSI tag or shell metacharacter. \n";
  387.     print "Please use your <B>Back</B> button, remove the tags or characters and re-submit. \n";
  388.     print "Thanks\!</H3></CENTER>\n";
  389.     exit;
  390. }
  391.  
  392. sub no_data {
  393.     print "It would seem that you've forgotten to fill in one or more of \n";
  394.     print "the required fields.  Please use your <B>Back</B> button to \n";
  395.     print "do that now.  Thanks\!\n";
  396.     exit;
  397. }